#ifndef _BITIMAGE_H_
#define _BITIMAGE_H_

#ifdef __cplusplus
extern "C"
{
#endif

#ifdef __cplusplus
}
#endif

#include <string>
#include <string.h>

#include "Image.h"

class BitImage : public Image
{
public:
    typedef struct
    {
        unsigned char type[2];    // 文件类型
        unsigned int size;        // 文件大小
        unsigned short reserved1; // 保留字段 1
        unsigned short reserved2; // 保留字段 2
        unsigned int offset;      // 到位图数据的偏移量
    } __attribute__((packed)) BmpFileHeader;

    /**** 位图信息头数据结构 ****/
    typedef struct
    {
        unsigned int size;        // 位图信息头大小
        int width;                // 图像宽度
        int height;               // 图像高度
        unsigned short planes;    // 位面数
        unsigned short bpp;       // 像素深度
        unsigned int compression; // 压缩方式
        unsigned int image_size;  // 图像大小
        int x_pels_per_meter;     // 像素/米
        int y_pels_per_meter;     // 像素/米
        unsigned int clr_used;
        unsigned int clr_omportant;
    } __attribute__((packed)) BmpInfoHeader;

private:
    FILE *file;
    bool inverted;       //是否是倒置位图,图片高度>0为倒置位图
    std::string file_name;    // 文件名
    BmpFileHeader file_h;     // 文件头
    BmpInfoHeader info_h;     // 图片信息头
    unsigned long line_bytes; // 一行的字节数
    unsigned long image_seek; // 图像数据偏移，分开读取一个图像时记录每次的读取的偏移量

public:
    BitImage(std::string path);
    ~BitImage();

    void GetImage(unsigned char *buf, unsigned long line) override;
    unsigned long GetImage();

    const void SetImageSeek(unsigned long seek) { image_seek = seek; }

    const unsigned long GetLineBytes() const { return line_bytes; }
    const ImageStatus GetStatus() const { return status; }

    unsigned char *BitImageZoom(int w, int h, unsigned char *bmpin, int zoomw, int zoomh, int bpp);
};

#endif
